package com.jc.photo.service;

import com.jc.photo.core.FileUtils;
import com.jc.photo.core.MediaTypeDetector;
import com.jc.photo.model.OrganizeResult;
import org.springframework.stereotype.Service;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * 媒体文件整理服务
 * 负责按年月->格式整理照片和视频文件
 */
@Service
public class MediaOrganizeService {
    
    /**
     * 获取文件的拍摄日期，优先从EXIF信息获取，失败则使用文件修改时间
     */
    private LocalDateTime getFileCreationDate(File file) {
        try {
            // 对于照片文件，尝试读取EXIF信息中的拍摄日期
            if (MediaTypeDetector.isPhotoFile(file)) {
                LocalDateTime exifDate = getPhotoDateFromExif(file);
                if (exifDate != null) {
                    return exifDate;
                }
            }
            
            // 使用文件的最后修改时间作为替代
            BasicFileAttributes attrs = java.nio.file.Files.readAttributes(file.toPath(), BasicFileAttributes.class);
            return LocalDateTime.ofInstant(attrs.lastModifiedTime().toInstant(), ZoneId.systemDefault());
        } catch (Exception e) {
            // 出现异常时返回文件的最后修改时间
            return LocalDateTime.now();
        }
    }
    
    /**
     * 从照片EXIF信息中提取拍摄日期（简化实现）
     * 实际项目中可以使用metadata-extractor等库来解析EXIF信息
     */
    private LocalDateTime getPhotoDateFromExif(File photoFile) {
        // 这里是简化实现，实际项目中应该解析真实的EXIF信息
        // 可以使用com.drew.metadata.exif.ExifReader等库
        return null; // 返回null表示无法获取EXIF日期
    }
    
    /**
     * 整理指定目录的媒体文件
     * 按照 年月/格式 的层级结构进行整理
     */
    public OrganizeResult organizeDirectory(File sourceDir) throws Exception {
        OrganizeResult result = new OrganizeResult();
        
        if (sourceDir == null || !sourceDir.exists() || !sourceDir.isDirectory()) {
            result.setMessage("目录不存在或无效");
            return result;
        }
        
        File[] files = sourceDir.listFiles();
        if (files == null) {
            result.setMessage("无法读取目录");
            return result;
        }
        
        // 扫描所有照片和视频文件，并按年月分组
        Map<String, Map<String, List<File>>> mediaByYearMonthAndFormat = new HashMap<>();
        List<OrganizeResult.MovedFileInfo> movedFiles = new ArrayList<>();
        
        // 扫描所有照片和视频文件
        for (File file : files) {
            if (file.isFile() && MediaTypeDetector.isMediaFile(file)) {
                // 获取文件的拍摄日期
                LocalDateTime creationDate = getFileCreationDate(file);
                String yearMonth = creationDate.format(DateTimeFormatter.ofPattern("yyyy-MM"));
                
                String extension = MediaTypeDetector.getFileExtension(file);
                if (extension != null) {
                    extension = extension.toLowerCase();
                    
                    // 按年月和格式分组
                    mediaByYearMonthAndFormat
                        .computeIfAbsent(yearMonth, k -> new HashMap<>())
                        .computeIfAbsent(extension, k -> new ArrayList<>())
                        .add(file);
                }
            }
        }
        
        if (mediaByYearMonthAndFormat.isEmpty()) {
            result.setMessage("未找到照片或视频文件");
            return result;
        }
        
        // 移动文件到对应的文件夹
        for (Map.Entry<String, Map<String, List<File>>> yearMonthEntry : mediaByYearMonthAndFormat.entrySet()) {
            String yearMonth = yearMonthEntry.getKey();
            Map<String, List<File>> formatMap = yearMonthEntry.getValue();
            
            // 创建年月目录
            File yearMonthDir = new File(sourceDir, yearMonth);
            FileUtils.ensureDirectoryExists(yearMonthDir);
            
            // 在年月目录下按格式分类
            for (Map.Entry<String, List<File>> formatEntry : formatMap.entrySet()) {
                String format = formatEntry.getKey();
                List<File> filesToMove = formatEntry.getValue();
                
                File targetDir = new File(yearMonthDir, format.toUpperCase());
                FileUtils.ensureDirectoryExists(targetDir);
                
                for (File file : filesToMove) {
                    Path targetPath = FileUtils.moveFile(file, targetDir);
                    OrganizeResult.MovedFileInfo movedFile = new OrganizeResult.MovedFileInfo(
                        file.getName(),
                        yearMonth + "/" + format.toUpperCase(),
                        targetPath.toString()
                    );
                    movedFiles.add(movedFile);
                }
            }
        }
        
        // 统计信息
        Map<String, Integer> formatCounts = new HashMap<>();
        for (Map.Entry<String, Map<String, List<File>>> yearMonthEntry : mediaByYearMonthAndFormat.entrySet()) {
            Map<String, List<File>> formatMap = yearMonthEntry.getValue();
            for (Map.Entry<String, List<File>> formatEntry : formatMap.entrySet()) {
                String format = formatEntry.getKey().toUpperCase();
                int count = formatEntry.getValue().size();
                formatCounts.put(format, Integer.valueOf(formatCounts.getOrDefault(format, Integer.valueOf(0)) + count));
            }
        }
        
        result.setTotalFiles(movedFiles.size());
        result.setFormats(formatCounts);
        result.setMovedFiles(movedFiles);
        result.setMessage("成功整理 " + movedFiles.size() + " 个文件");
        
        return result;
    }
}

